package posts_api

import (
	"software/global"
	"strconv"
	"strings"

	"github.com/gin-gonic/gin"
	"go.mongodb.org/mongo-driver/bson/primitive"

	"software/models/res"
	"software/service"
)

// PostsApi 帖子API控制器

// InitTestData 初始化测试数据
func (p PostsApi) InitTestData(c *gin.Context) {
	// 调用服务初始化测试数据
	if err := service.InitTestData(c); err != nil {
		res.FailWithMsg("初始化测试数据失败: "+err.Error(), c)
		return
	}

	// 返回成功响应
	res.OKWithMsg("测试数据初始化成功", c)
}

// GetPostList 获取帖子列表
func (p PostsApi) GetPostList(c *gin.Context) {
	// 调用服务获取帖子列表
	posts, err := service.GetPostList(c)
	if err != nil {
		res.FailWithMsg("获取帖子列表失败: "+err.Error(), c)
		return
	}

	// 返回成功响应
	res.OKWithData(posts, c)
}

// GetAllPostsWithDetails 获取所有帖子的详细内容
func (p PostsApi) GetAllPostsWithDetails(c *gin.Context) {
	// 获取查询参数
	page := 1
	pageSize := 10

	// 获取页码参数
	pageStr := c.Query("page")
	if pageStr != "" {
		if val, err := strconv.Atoi(pageStr); err == nil && val > 0 {
			page = val
		}
	}

	// 获取每页数量参数
	pageSizeStr := c.Query("pageSize")
	if pageSizeStr != "" {
		if val, err := strconv.Atoi(pageSizeStr); err == nil && val > 0 {
			pageSize = val
			// 限制最大页面大小
			if pageSize > 50 {
				pageSize = 50
			}
		}
	}

	// 获取关键词、状态和分类参数
	keyword := c.Query("keyword")
	status := -1 // 默认不过滤状态
	statusStr := c.Query("status")
	if statusStr != "" {
		if val, err := strconv.Atoi(statusStr); err == nil {
			status = val
		}
	}
	category := c.Query("category")

	global.Log.Infof("接收到请求参数: page=%d, pageSize=%d, keyword=%s, status=%d, category=%s",
		page, pageSize, keyword, status, category)

	// 调用服务获取所有帖子详细内容
	result, err := service.GetAllPostsWithDetails(c.Request.Context(), page, pageSize, keyword, status, category)
	if err != nil {
		res.FailWithMsg("获取帖子详细内容失败: "+err.Error(), c)
		return
	}

	// 返回成功响应
	res.OKWithData(result, c)
}

// GetPostDetail 获取帖子详细内容
func (p PostsApi) GetPostDetail(c *gin.Context) {
	// 获取帖子ID参数
	postIDStr := c.Param("id")

	// 尝试将ID转换为ObjectID
	objectID, err := primitive.ObjectIDFromHex(postIDStr)
	if err != nil {
		res.FailWithMsg("无效的帖子ID格式", c)
		return
	}

	// 调用服务获取帖子详情
	post, err := service.GetPostDetail(c, objectID)
	if err != nil {
		// 检查错误信息是否包含"帖子不存在"
		if strings.Contains(err.Error(), "帖子不存在") {
			res.FailWithMsg("帖子不存在，请确认ID是否正确", c)
			return
		}
		res.FailWithMsg("获取帖子详情失败: "+err.Error(), c)
		return
	}

	// 返回成功响应
	res.OKWithData(post, c)
}

/**
 * 更新帖子状态
 */
func (p PostsApi) UpdatePostsStatus(c *gin.Context) {
	var req struct {
		ID     string `json:"id" binding:"required"`     // 帖子ID
		Status int    `json:"status" binding:"required"` // 状态值
	}

	// 绑定并验证请求数据
	if err := c.ShouldBindJSON(&req); err != nil {
		res.FailWithMsg("参数错误", c)
		return
	}

	// 将ID转换为ObjectID
	objectID, err := primitive.ObjectIDFromHex(req.ID)
	if err != nil {
		res.FailWithMsg("无效的帖子ID格式", c)
		return
	}

	// 调用服务层更新帖子状态
	if err := service.UpdatePostStatus(c, objectID, req.Status); err != nil {
		global.Log.Error("更新帖子状态失败", err)
		res.FailWithMsg("更新失败", c)
		return
	}

	// 返回成功响应
	res.OK(c)
}

/**
 * 删除帖子
 */
func (p PostsApi) DeletePost(c *gin.Context) {
	// 获取帖子ID参数
	postIDStr := c.Param("id")

	// 尝试将ID转换为ObjectID
	objectID, err := primitive.ObjectIDFromHex(postIDStr)
	if err != nil {
		res.FailWithMsg("无效的帖子ID格式", c)
		return
	}

	// 获取帖子详情，用于获取图片ID
	post, err := service.GetPostDetail(c, objectID)
	if err != nil {
		if strings.Contains(err.Error(), "帖子不存在") {
			res.FailWithMsg("帖子不存在，请确认ID是否正确", c)
			return
		}
		res.FailWithMsg("获取帖子详情失败: "+err.Error(), c)
		return
	}

	// 软删除帖子
	if err := service.SoftDeletePost(c, objectID); err != nil {
		global.Log.Error("删除帖子失败", err)
		res.FailWithMsg("删除失败: "+err.Error(), c)
		return
	}

	// 如果帖子有关联图片，处理图片的隐藏逻辑
	imageID, ok := post["image_id"].(int64)
	if ok && imageID > 0 {
		if err := service.HidePhotoByID(c, uint(imageID)); err != nil {
			global.Log.Warnf("隐藏关联图片失败（ID: %d）: %v", imageID, err)
			// 不中断操作，继续返回成功
		}
	}

	// 返回成功响应
	res.OKWithMsg("帖子删除成功", c)
}
